package cn.client.ui.components

import android.net.Uri
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.source.ProgressiveMediaSource
import com.google.android.exoplayer2.source.hls.HlsMediaSource
import com.google.android.exoplayer2.ui.PlayerView
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
import com.google.android.exoplayer2.util.Util


/**
 * 流媒体播放的可组合项
 */
@Composable
fun PlayerScreen(url: String) {
    // Fetching the Local Context
    val mContext = LocalContext.current
    val mediaUrl = url.addM3u8()

    val mExoPlayer = remember(mContext, mediaUrl) {
        val exoPlayer = ExoPlayer.Builder(mContext).build().apply {
            val dataSourceFactory = DefaultDataSourceFactory(
                mContext,
                Util.getUserAgent(mContext, mContext.packageName)
            )

            // 根据URL后缀创建媒体源
            val mediaSource: MediaSource = when {
                mediaUrl.endsWith(".m3u8") -> {
                    // HLS流媒体视频
                    HlsMediaSource.Factory(dataSourceFactory)
                        .createMediaSource(Uri.parse(mediaUrl))
                }
                else -> {
                    // 默认是音频资源
                    ProgressiveMediaSource.Factory(dataSourceFactory)
                        .createMediaSource(Uri.parse(mediaUrl))
                }
            }
            prepare(mediaSource)
        }
        exoPlayer
    }

    DisposableEffect(Unit) {
        onDispose {
            mExoPlayer.release()
        }
    }

    if (mediaUrl.endsWith(".m3u8")) {
        // 如果是HLS流媒体视频，使用PlayerView
        AndroidView(factory = { context ->
            PlayerView(context).apply {
                player = mExoPlayer
            }
        })
    } else {
        // 如果是音频资源，使用其他音频播放组件（如自定义的AudioPlayer）
        AudioPlayer(mContext, mExoPlayer)
    }

}

fun String.addM3u8(): String {
    // 提取URL的文件扩展名
    val extension = lastIndexOf('.')

    // 使用is检查来处理已知的音频格式
    return when (if (extension != -1) substring(extension + 1) else null) {
        "m3u8" -> this // 如果是.m3u8结尾，则不添加
        "mp3", "wav" -> this // 如果是已知的音频格式，则不添加
        // 可以继续添加其他音频格式...
        else -> "$this/index.m3u8" // 对于其他任何情况，添加/index.m3u8
    }
}
